package service

import (
	"WebApplication/db"
	"WebApplication/dtos"
	"WebApplication/handler"
	"WebApplication/model"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"

)

// 服务层

// 添加订单 在服务层会将结果封装成response类型的格式并返回给调用方（路由）
func CreateOrder(context *gin.Context){
	DB := context.MustGet("orderdatabase").(*db.OrderDatabase)
	var order model.Order
	if err := handler.GetJson(context, &order); err != nil{
		response := dtos.Response{Successful:false, Message: err.Error()}
		context.JSON(http.StatusBadRequest, response)
	}
	opResult := DB.Save(&order)
	// 如果数据库操作失败了 返回一个响应，响应格式在dtos包中定义了
	if opResult.Error != nil{
		response := dtos.Response{Successful:false, Message: opResult.Error.Error()}
		context.JSON(http.StatusBadRequest, response)
	}
	// 如果操作成功了  返回一个响应
	response := dtos.Response{Successful:true, Message: "create successful!", Data: order}
	context.JSON(http.StatusOK, response)
}

// 上传文件  利用事务，上传失败回滚
func UpLoadFileService(context *gin.Context){
	orderdatabase := context.MustGet("orderdatabase").(*db.OrderDatabase)

	// 得到了order_no
	OrderNo := context.Param("OrderNo")
	fmt.Println(OrderNo)
	// 获取文件头
	file, GetFileHeadErr := context.FormFile("upload")
	if GetFileHeadErr != nil{
		context.JSON(http.StatusBadRequest, dtos.Response{Successful:false, Message:GetFileHeadErr.Error()})
		fmt.Println(GetFileHeadErr)
		return
	}
	// 获取路径
	filename := file.Filename
	fileurl := "./file/" + filename

	// 更新数据库： 创建一个新的事务
	transaction := orderdatabase.Database.Begin()
	orderdatabase.Transaction = transaction
	opResult := orderdatabase.UpdateUrl(OrderNo, fileurl)
	if opResult.Error != nil{
		context.JSON(http.StatusBadRequest, dtos.Response{Successful:false, Message:opResult.Error.Error()})
		fmt.Println(opResult.Error)
		return
	}
	// 上传
	if _, err := os.Open(fileurl);err != nil{fileurl = "./" + filename}
	if err := context.SaveUploadedFile(file, fileurl);err != nil{
		context.JSON(http.StatusBadRequest, dtos.Response{Successful:false, Message:err.Error()})
		orderdatabase.Transaction.Rollback()
		fmt.Println(err , "here")
		return
	}
	orderdatabase.Transaction.Commit()
	context.JSON(http.StatusOK, dtos.Response{Successful:true, Message:"上传成功！",Data:opResult.Result})
}

// 下载文件
func FileDownLoadService(c *gin.Context){
	filename := c.Param("filename")
	_, errByOpenFile := os.Open("file/" + filename)
	// 打开文件发生错误
	if errByOpenFile != nil{
		fmt.Println(errByOpenFile)
		c.JSON(http.StatusNotFound, gin.H{
			"msg": "资源不存在",
			"error": errByOpenFile,
		})
		return
	}
	fmt.Println("打开文件成功")
	// 没有发生错误
	c.Header("Content-Type", "application/jpg")
	c.Header("Content-Disposition", "attachment; filename="+filename)
	c.Header("Content-Transfer-Encoding", "binary")
	c.File( "./file/" + filename)
	c.JSON(http.StatusOK, gin.H{
		"result": "successful",
	})
}

// 查询
func SelectAll(context *gin.Context){
	DB := context.MustGet("orderdatabase").(*db.OrderDatabase)
	opResult := DB.FindAll()
	// 查询操作失败了 -> 输出失败的响应
	if opResult.Error != nil{
		context.JSON(http.StatusBadRequest, dtos.Response{Successful:false, Message: opResult.Error.Error()})
		return
	}
	// 如果成功  返回成功的响应
	context.JSON(http.StatusOK, dtos.Response{Successful:true, Message:"查询全部数据成功！", Data: opResult.Result})
}

// 根据名字模糊查找
func NameCheckService(context *gin.Context){
	DB := context.MustGet("orderdatabase").(*db.OrderDatabase)
	// 获取名字
	name := context.Param("name")
	// 数据库查找关键字
	opResult := DB.SelectAtName(name)
	if opResult.Error != nil{
		context.JSON(http.StatusBadRequest, dtos.Response{Successful:false, Message: opResult.Error.Error()})
		return
	}
	context.JSON(http.StatusOK, dtos.Response{Successful:true, Message:"查找成功", Data: opResult.Result})
}



